import { defineStore } from 'pinia'
import request from '@/utils/request'
import { ApiRes } from '@/types/data'
import { CartItem } from '@/types/cart'
import { UpdateType } from '@/types/cart'
import useStore from '..'
type InfoType = {
  discount: null
  isEffective: boolean
  nowPrice: number
  oldPrice: null
  stock: number
}
const useCartStore = defineStore('cart', {
  // 共享的数据
  state() {
    return {
      // 购物车列表数据
      list: [] as CartItem[],
    }
  },
  // persist: true, 直接将当前模块的所有的数据存储在localStorage中
  persist: {
    key: 'xtx-cart', // 指定存储的键名
    // storage: localStorage, // 指定存储的方式sessionStorage/localStorage
    // paths: ['list', 'a'], // 指定哪些属性做存储
  },
  actions: {
    // 获取购物车列表
    async getCartList() {
      if (this.isLogin) {
        const res = await request.get<ApiRes<CartItem[]>>('/member/cart')
        this.list = res.data.result
      } else {
        // 未登录状态下  主动获取一次商品的信息
        this.list.forEach(async (item) => {
          // console.log(item.skuId)
          const {
            data: { result },
          } = await request.get<ApiRes<InfoType>>(`/goods/stock/${item.skuId}`)
          item.isEffective = result.isEffective
          item.nowPrice = result.nowPrice + ''
          item.stock = result.stock
        })
      }
    },
    // 加入购物车
    async addCart(data: CartItem) {
      if (this.isLogin) {
        await request.post('/member/cart', {
          skuId: data.skuId,
          count: data.count,
        })
        // 重新获取购物车列表数据
        this.getCartList()
      } else {
        // console.log('本地操作')
        // 在向list追加之前, 先判断是否有已经存在的规格,如果有,直接累加count, 没有的话再追加
        const goods = this.list.find((item) => item.skuId === data.skuId)
        if (goods) {
          goods.count += data.count
        } else {
          this.list.unshift(data)
        }
      }
    },
    // 删除购物车商品
    // delete请求如果是query参数 应该写 params
    // delele请求如果是body参数 应该写data
    // ['100', '101', '102']
    async delCart(skus: string[]) {
      if (this.isLogin) {
        await request.delete('/member/cart', { data: { ids: skus } })
        // 重新获取购物车列表数据
        this.getCartList()
      } else {
        // this.list = this.list.filter((item) => item.skuId !== skus[0])
        this.list = this.list.filter((item) => !skus.includes(item.skuId))
      }
    },
    // 更新商品数量/状态
    async updateCart(data: UpdateType) {
      if (this.isLogin) {
        await request.put(`/member/cart/${data.skuId}`, data)
        // 重新获取购物车列表数据
        this.getCartList()
      } else {
        // console.log('本地操作', data)
        // 先找到要修改的那一项商品  查找
        const goods = this.list.find((item) => item.skuId === data.skuId)
        // 改数量
        if (data.count) {
          goods!.count = data.count
        }
        // 改选中状态
        if (data.selected !== undefined) {
          goods!.selected = data.selected
        }
      }
    },
    // 全选反选商品状态更改 selected是要更新的状态 ids是所有商品的skuid的集合 放在一个数组中
    async toggleCheck(data: { selected: boolean; ids: string[] }) {
      if (this.isLogin) {
        await request.put('/member/cart/selected', data)
        // 重新获取购物车列表数据
        this.getCartList()
      } else {
        // console.log('本地操作', data)
        // 只需要循环遍历list 设置每一项的选中为 data.selected
        this.list.forEach((item) => (item.selected = data.selected))
      }
    },
    // 清空购物车
    clearCart() {
      this.list = []
    },
    // 合并购物车
    async mergeList() {
      // console.log(this.list)
      // 1. 对list进行字段的处理
      const data = this.list.map((item) => ({
        skuId: item.skuId,
        selected: item.selected,
        count: item.count,
      }))
      // 2. 携带处理好的数据发送请求, 结果不需要接收,
      await request.post('/member/cart/merge', data)
      // 3 登录获取最新的购物车列表
      this.getCartList()
    },
  },
  getters: {
    // 基于商品列表 得到一份有效的商品列表 库存>0&&有效
    effectiveList(): CartItem[] {
      return this.list.filter((item) => item.isEffective && item.stock > 0)
    },
    // 基于有效商品做商品数量统计
    totalCount(): number {
      return this.effectiveList.reduce((sum, item) => sum + item.count, 0)
    },
    // 基于有效商品做商品价钱统计
    totalMoney(): string {
      return this.effectiveList
        .reduce((sum, item) => sum + item.count * +item.nowPrice, 0)
        .toFixed(2)
    },
    // 是否全选
    isCheckAll(): boolean {
      return (
        this.effectiveList.length > 0 &&
        this.effectiveList.every((item) => item.selected)
      )
    },
    // 已选商品
    selectedList(): CartItem[] {
      return this.effectiveList.filter((item) => item.selected)
    },
    // 已选商品的数量
    selectedCount(): number {
      return this.selectedList.reduce((sum, item) => sum + item.count, 0)
    },
    // 已选商品的总价
    selectedAllPrice(): string {
      return this.selectedList
        .reduce((sum, item) => sum + item.count * +item.nowPrice, 0)
        .toFixed(2)
    },
    // 是否登录
    isLogin(): boolean {
      const { user } = useStore()
      // return user.userInfo.token ? true : false
      return !!user.userInfo.token
    },
  },
})
export default useCartStore
